/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.core;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import pe.core.db.AnuncioDto;
import pe.core.db.BloqueDto;
import pe.core.db.MillionDBManager;
import pe.core.util.Matcher;

/**
 *
 * @author romulogalindo
 */
public class MillionFactory {

    private static String url;
    private static List<AnuncioDto> maps;
    private static String imagen;

    public static synchronized void home(String murl) {
        url = murl;
    }

    public static synchronized void procesar(List<AnuncioDto> anuncios) throws Exception {
        //despues de leer la lista de items
        if (anuncios == null) {
            throw new Exception("Lista vacia");
        }
        MillionDBManager db = new MillionDBManager();
        //Generación de imagen
        BufferedImage bimg = new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = (Graphics2D) bimg.getGraphics();
        g2d.setBackground(Color.WHITE);
        g2d.fillRect(0, 0, 1000, 1000);
        g2d.setColor(Color.WHITE);
        Image grilla = null;
        try {
            System.out.println("buscando...:" + url + "/grilla.png");
            grilla = ImageIO.read(new FileInputStream(url + "/grilla.png"));
        } catch (IOException ep) {
        }
        if (grilla == null) {
            throw new Exception("La imagen de fondo no se encontro");
        }
        g2d.drawImage(grilla, 0, 0, 1000, 1000, null);

        for (AnuncioDto anuncio : anuncios) {
            Image img;
            try {
                BloqueDto bloini = db.getPosicion(anuncio.getCo_bloini());
                BloqueDto blofin = db.getPosicion(anuncio.getCo_blofin());
                anuncio.setX(bloini.getNu_coordx());
                anuncio.setY(bloini.getNu_coordy());
                anuncio.setX1(blofin.getNu_coordx() - bloini.getNu_coordx() + 1);
                anuncio.setY1(blofin.getNu_coordy() - bloini.getNu_coordy() + 1);
                img = db.getImage(anuncio.getId_arcadj());
                System.out.println("[" + anuncio.getNo_anunci() + "][img:" + img + "][x:" + ((anuncio.getX() - 1) * 10) + "][y:" + ((anuncio.getY() - 1) * 10) + "][w:" + (anuncio.getX1() * 10) + "][h:" + (anuncio.getY1() * 10) + "]");
//                img = ImageIO.read(new FileInputStream(url + "/1398099332343.jpg"));
//                g2d.drawImage(img, (item.getX() * 10) - 10, (item.getY() * 10) - 10, item.getX1() * 10, item.getY1() * 10, null);
                g2d.drawImage(img, ((anuncio.getX() - 1) * 10), ((anuncio.getY() - 1) * 10), anuncio.getX1() * 10, anuncio.getY1() * 10, null);
            } catch (Exception ep) {
                System.out.println("Error al dibujar imagen:" + ep.getMessage());
                g2d.drawRect((anuncio.getX() * 10) - 10, (anuncio.getY() * 10) - 10, anuncio.getX1() * 10, anuncio.getY1() * 10);
            }
        }

        g2d.dispose();
        imagen = url + "/" + System.currentTimeMillis() + ".jpg";
        ImageIO.write(bimg, "jpg", new File(imagen));
        //Fin de generación de imagen

        //Generando objetos del map
        List<AnuncioDto> maps2 = new ArrayList<>();
        for (int y = 0; y < 1000; y = y + 10) {
            for (int x = 0; x < 1000; x = x + 10) {
                AnuncioDto anuncio = new AnuncioDto();
//                item.setId(x + "" + y);
                anuncio.setId((x / 10 + 1) + "x" + (y / 10 + 1) + "y");
//                System.out.print(">>" + item.getId() + "  ");
                anuncio.setX((x / 10) + 1);
                anuncio.setY((y / 10) + 1);
                anuncio.setX1(1);
                anuncio.setY1(1);
//                anuncio.setShape("rect");
//                anuncio.setTarget("_blank");
                anuncio.setNo_anunci("Item disponible (" + (x / 10 + 1) + "," + (y / 10 + 1) + ")");
//                anuncio.setXe(false);
                anuncio.setVacio(true);
                maps2.add(anuncio);
            }
//            System.out.println("");
        }
//        System.out.println("items a agregar:" + maps2.size() + "::" + l.size() + ":: deberia:" + (maps2.size() - l.size()));
        for (AnuncioDto anuncio : anuncios) {
            //procedimiento de eliminación de extras
//            System.out.println("Ready!" + anuncio.getId() + "::" + anuncio.getUr_anunci()+ "::" + anuncio.getNo_anunci()+ "::" + anuncio.getName() + "::: [x:" + anuncio.getX() + ", x1:" + anuncio.getX1() + "][y: " + anuncio.getY() + ",y1 : " + anuncio.getY1() + "]");
            System.out.println("Ready!" + anuncio.getId() + "::" + anuncio.getUr_anunci() + "::" + anuncio.getNo_anunci() + "::: [x:" + anuncio.getX() + ", x1:" + anuncio.getX1() + "][y: " + anuncio.getY() + ",y1 : " + anuncio.getY1() + "]");
            for (int y = ((anuncio.getY()) / 1); y < (anuncio.getY() + anuncio.getY1()) / 1; y = y + 1) {
                for (int x = ((anuncio.getX()) / 1); x < (anuncio.getX() + anuncio.getX1()) / 1; x = x + 1) {
                    final String s = (x) + "x" + (y) + "y";
                    System.out.println("[s:" + s + "]>" + maps2.size());
                    List l2 = searchIn(maps2, new Matcher<AnuncioDto>() {
                        @Override
                        public boolean matches(AnuncioDto p) {
//                            System.out.println("[p.getId():" + p.getId() + "][s:" + s + "]");
                            return p.getId().equals(s);
                        }
                    });
                    if (l2 != null) {
                        if (l2.size() > 0) {
                            maps2.remove(l2.get(0));
                        }
                    }
                }
            }
            System.out.println("====>>" + anuncio.getNo_anunci());
            maps2.add(anuncio);
//            System.out.println("item>>lara>>"+maps2.size()+">>>>"+item.getHref());
        }
        maps = maps2;
        //Fin de generación de objetos maps

    }

    public static List<AnuncioDto> maplist() {
        return maps;
    }

    public static String ImagenUrl() {
        return imagen;
    }

    public static <T> List<T> searchIn(List<T> list, Matcher<T> m) {
        List<T> r = new ArrayList<>();
        for (T t : list) {
            if (m.matches(t)) {
                r.add(t);
            }
        }
        return r;
    }

}
